package app.data;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.util.ArrayList;
import java.util.List;
import app.model.Product;
import app.model.tree.BST;
import app.model.tree.Node;
import app.model.tree.ProductNode;
/**
* Represents the Warehouse which is responsible for keeping the Products and
* their corresponding stock. This class uses a Binary Search Tree in order to
* store the products. We also provide means to create, updated and delete
* products.
*
* @author Bogdan
*
*/
public class Warehouse {
private BST tree;
public BST getTree() {
return tree;
}
public Warehouse() {
loadDataFromDisk();
if (tree == null) {
tree = new BST();
Product whiteTShirt = new Product(1, "Milk", "great milk with low fat", 0);
Product redTShirt = new Product(2, "Tomatoes", "big juicy and tasty tomatoes", 12);
ProductNode p1 = new ProductNode(whiteTShirt);
ProductNode p2 = new ProductNode(redTShirt);
this.tree.insert(p1);
this.tree.insert(p2);
// this.tree.display(tree.root);
}
}
private void loadDataFromDisk() {
try {
FileInputStream fileIn = new FileInputStream("C:\\products.ser");
ObjectInputStream in = new ObjectInputStream(fileIn);
this.tree = (BST) in.readObject();
in.close();
fileIn.close();
} catch (IOException e) {
System.out.println("FIle not found");
return;
} catch (ClassNotFoundException c) {
System.out.println("Tree class was not found");
c.printStackTrace();
return;
}
}
public void addNewProduct(Product newProduct) {
ProductNode productNode = new ProductNode(newProduct);
tree.insert(productNode);
}
public void updateProduct(int productID, int stock) {
tree.update(productID, stock);
}
public List<Node> getAllProducts() {
return tree.getAllNodes(tree.root);
}
public List<Node> getProductsByFilter(String filter) {
List<Node> allItems = getAllProducts();
List<Node> result = new ArrayList<>();
for (Node currentNode : allItems) {
if (currentNode.getNodeName().toLowerCase().contains(filter.toLowerCase())) {
result.add(currentNode);
}
}
return result;
}
public void deleteProduct(Product product) {
tree.delete(product);
}
public Product getProductByName(String name) {
for (Node current : getAllProducts()) {
if (current.getNodeName().equals(name)) {
if (current instanceof ProductNode) {
return ((ProductNode) current).getProduct();
}
}
}
return null;
}
public int getProductStockByName(String name) {
for (Node current : getAllProducts()) {
if (current.getNodeName().equals(name)) {
if (current instanceof ProductNode) {
return ((ProductNode) current).getProduct().getStock();
}
}
}
return -1;
}
public int getMaxProductID() {
int max = 0;
for (Node current : getAllProducts()) {
if (current.getNodeID() > max) {
max = current.getNodeID();
}
}
return max;
}
}